package com.nowcoder.topic.bisection.middle;

import java.util.ArrayList;
import java.util.Collections;

/**
 * NC382 切割木头
 * @author d3y1
 */
public class NC382{
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param a int整型一维数组
     * @param k int整型
     * @return int整型
     */
    public int cutWood (ArrayList<Integer> a, int k) {
        return solution(a, k);
    }

    /**
     * 二分
     * @param a
     * @param k
     * @return
     */
    private int solution(ArrayList<Integer> a, int k){
        Collections.sort(a);

        int result = -1;
        int n = a.size();
        int left = 1;
        int right = a.get(n-1);
        int mid;
        while(left <= right){
            mid = left+(right-left)/2;
            if(checkCutWoods(a, k, mid)){
                result = mid;
                left = mid+1;
            }else{
                right = mid-1;
            }
        }

        return result;
    }

    /**
     * 校验截断后的木头是否满足条件(至少k个长度都为m的木头)
     * @param a
     * @param k
     * @param m
     * @return
     */
    private boolean checkCutWoods(ArrayList<Integer> a, int k, int m){
        int n = a.size();
        // 原始木头长度
        int val;
        // 截断后满足条件的木头数
        int cnt = 0;
        for(int i=n-1; i>=0; i--){
            val = a.get(i);
            if(val < m){
                break;
            }
            cnt += val/m;
            if(cnt >= k){
                return true;
            }
        }

        return false;
    }
}